package study.activiti.c_processInstance;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

import sun.net.www.content.image.jpeg;

/**  
 * @Name: ProcessInstanceTest
 * @Description: 流程实例测试类：流程实例，执行对象控制流程的执行任务
 * @Author: 李超
 * @Create Date: 2016-12-11
 */
public class ProcessInstanceTest {
	
	//获取流程引擎对象
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	/**  
	* @Name: delpoymentProcessDefinition_zip（方法的名称）
	* @Description: 部署流程定义（zip格式文件）（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void delpoymentProcessDefinition_zip() {
		//获取上传文件的输入流对象
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/HelloWorld.zip") ;
		ZipInputStream zipInputStream = new ZipInputStream(in) ;
		//获取仓库服务，从类路径下完成部署
		Deployment deployment = processEngine.getRepositoryService()
					 .createDeployment()
					 .name("部署流程定义的名称")
					 .addZipInputStream(zipInputStream)
					 .deploy() ; //完成部署
		System.out.println("id[部署id]：" + deployment.getId()); 
		System.out.println("name[部署名称]：" + deployment.getName()); 
	}
	
	/**  
	* @Name: startProcessInstance（方法的名称）
	* @Description: 启动流程实例（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void startProcessInstance() {
		//流程定义的key
		String processDefinitionKey = "helloworld" ;
		//启动流程定义
		ProcessInstance instance = processEngine.getRuntimeService()
					 .startProcessInstanceByKey(processDefinitionKey) ;
		System.out.println("pid[流程实例id]:" + instance.getId()); 
		System.out.println("activitiId[流程定义id]:" + instance.getProcessDefinitionId());
	}
	
	/**  
	* @Name: startProcessInstance（方法的名称）
	* @Description: 查询当前人的个人任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void findMyPersonalTask() {
		//指定任务办理人
		String assignee = "张三" ;
		//返回任务集合
		List<Task> list = processEngine.getTaskService() //TaskService：与正在执行的任务管理相关的Service
		 			 .createTaskQuery() //创建任务查询对象
		 			 //设置查询条件，where部分
		 			 .taskAssignee(assignee) //个人任务查询，指定办理人
//		 			 .taskCandidateUser(taskCandidateUser) //组任务的办理人查询
//		 			 .processDefinitionId(processDefinitionId) //使用流程定义id查询
//		 			 .processInstanceId(processInstanceId) //使用流程实例id查询
//		 			 .executionId(executionId) //使用执行对象id查询
		 			 //排序
		 			 .orderByTaskCreateTime().asc() //使用任务创建时间升序排列
		 			 //返回结果集
//		 			 .singleResult() ; //返回唯一结果集
//		 			 .count() ; //返回结果集的数量
//		 			 .listPage(firstResult, maxResult) ; //分页查询
		 			 .list() ; //返回结果集列表
		if(list != null && list.size() > 0) {
			for (Task task : list) {
				//遍历输出任务对象task中的属性，对应数据表act_ru_task中的字段
				System.out.println("任务id:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务创建时间:" + task.getCreateTime());
				System.out.println("任务办理人:" + task.getAssignee());
				System.out.println("流程实例id:" + task.getProcessInstanceId());
				System.out.println("流程执行对象id:" + task.getExecutionId());
				System.out.println("流程定义id:" + task.getProcessDefinitionId());
				System.out.println("########################################");
			}
		}
	}
	
	/**  
	* @Name: completeMyPersonalTask（方法的名称）
	* @Description: 第4步：办理（完成）当前人的个人任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-12 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void completeMyPersonalTask() {
		//任务id
		String taskId = "32502" ;
		processEngine.getTaskService() //TaskService：与正在执行的任务管理相关的Service
					 .complete(taskId) ; //办理(完成)我的个人任务
		System.out.println("完成任务：任务id为" + taskId);
	}
	
	/**  
	* @Name: isProcessEnd（方法的名称）
	* @Description: 查询流程状态（判断流程正在执行，还是结束）（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-12 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void isProcessEnd() {
		//流程实例ID
		String processInstanceId = "27501" ;
		ProcessInstance pi = processEngine.getRuntimeService()
					 .createProcessInstanceQuery() //创建流程实例查询对象，查询正在执行的流程实例
					 .processInstanceId(processInstanceId) //根据流程实例ID查询
					 .singleResult() ; //返回唯一的结果集
		if(pi != null) {
			System.out.println("当前流程在:" + pi.getActivityId());
		} else {
			System.out.println("流程已结束");
		}
	}
	
	/**  
	* @Name: queryHistoryTask（方法的名称）
	* @Description: 附加功能：查询历史任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-12 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryHistoryTask() {
		//历史任务办理人
		String taskAssignee = "张三" ;
		//查询指定办理人的历史任务
		List<HistoricTaskInstance> list = processEngine.getHistoryService()
					 .createHistoricTaskInstanceQuery() //创建历史任务实例查询
					 .taskAssignee(taskAssignee) //根据任务办理人查询历史任务
					 .list() ;
		if(list != null && list.size() > 0) {
			for (HistoricTaskInstance hti : list) {
				System.out.println("任务ID:" + hti.getId());
				System.out.println("流程实例ID:" + hti.getProcessInstanceId());
				System.out.println("执行对象ID:" + hti.getExecutionId());
				System.out.println("任务名称:" + hti.getName());
				System.out.println("任务办理人:" + hti.getAssignee());
				System.out.println("任务开始时间:" + hti.getStartTime());
				System.out.println("任务结束时间:" + hti.getEndTime());
				System.out.println("任务执行时间:" + hti.getDurationInMillis() + "ms");
			}
		}
	}
	
	/**  
	* @Name: queryProcessInstance（方法的名称）
	* @Description: 附加功能：查询历史流程实例（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-12 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryProcessInstance() {
		//流程实例ID
		String processInstanceId = "27501" ;
		List<HistoricProcessInstance> list = processEngine.getHistoryService()
					 .createHistoricProcessInstanceQuery() //创建历史流程实例查询对象
					 .processInstanceId(processInstanceId) //使用流程实例ID查询
					 .list() ;
		if(list != null && list.size() > 0) {
			for (HistoricProcessInstance hpi : list) {
				System.out.println("流程定义ID:" + hpi.getProcessDefinitionId());
				System.out.println("流程实例ID:" + hpi.getId());
				System.out.println("流程实例创建时间:" + hpi.getStartTime());
				System.out.println("流程实例结束时间:" + hpi.getEndTime());
				System.out.println("流程实例执行时间:" + hpi.getDurationInMillis() + "ms");
			}
		}
	}

}
